package psim;

/**
 * Trida, ktera zapouzdruje staticke metody, ktere pocitaji interakci samotnych castic
 *
 * @author Tomas Drimal
 */
public class PtcCompute {

    /**
     * Metoda, ktera pocita novou rychlost castice pt1 z castice pt2
     * uvazuji se naboje jednotlivych castic
     * @param pt1 castice, pro kterou se pocita nova rychlost
     * @param pt2 castice, ze ktere se pocita nova rychlost
     */
   public static void chVelElectricity(Particle pt1, Particle pt2){
        // x ova vydalenost mezi pt1 a pt2
        double dx = pt2.old_x - pt1.old_x;
        // z nova vzdalenost mezi pt1 a pt2
        double dy = pt2.old_y - pt1.old_y;

//        double d2 = 6.67e-11/((dx*dx) + (dy*dy)); //puvodni radek
        double d2 = (dx*dx) + (dy*dy);
        double k_d2 = 9e16/d2*1;
        double a1=k_d2*pt2.q; //zrychleni 1. castice
        double a2=k_d2*pt1.q; //zrychleni 2. castice
        // distance mezi obema casticemi
        double d=Math.sqrt(d2);
        double r0x=dx/d; //x-slozka jednotkoveho vektoru od pt1 k pt2
        double r0y=dy/d; //y-slozka jednotkoveho vektoru od pt1 k pt2

        pt1.vx = pt1.vx-a1*Main.dt*r0x;
        pt1.vy = pt1.vy-a1*Main.dt*r0y;
        pt2.vx = pt2.vx+a2*Main.dt*r0x;
//        pt2.setVy(pt2.getVy()-a2*Main.dt*r0x);//puvodni radek
        pt2.vy = pt2.vy+a2*Main.dt*r0y;

    }

   /**
     * Metoda, ktera pocita novou rychlost castice pt1 z castice pt2
     * uvazuje se gravitacni sila mezi casticemi
     * @param pt1 castice, pro kterou se pocita nova rychlost
     * @param pt2 castice, ze ktere se pocita nova rychlost
     */
    public static void chVelGravitational(Particle pt1, Particle pt2){
        // x ova vydalenost mezi pt1 a pt2
        double dx = pt2.old_x - pt1.old_x;
        // z nova vzdalenost mezi pt1 a pt2
        double dy = pt2.old_y - pt1.old_y;

//        double d2 = 6.67e-11/((dx*dx) + (dy*dy)); //puvodni radek
        double d2 = (dx*dx) + (dy*dy);
        double kappa_d2 = 6.67e-11/d2*1;
        double a1=kappa_d2*pt2.m; //zrychleni 1. castice
        double a2=kappa_d2*pt1.m; //zrychleni 2. castice
        // distance mezi obema casticemi
        double d=Math.sqrt(d2);
        double r0x=dx/d; //x-slozka jednotkoveho vektoru od pt1 k pt2
        double r0y=dy/d; //y-slozka jednotkoveho vektoru od pt1 k pt2

        pt1.vx = pt1.vx+a1*Main.dt*r0x;
//        pt1.setVy(pt1.getVy()+a1*Main.dt*r0x);//puvodni radek
        pt1.vy = pt1.vy+a1*Main.dt*r0y;
        pt2.vx = pt2.vx-a2*Main.dt*r0x;
//        pt2.setVy(pt2.getVy()-a2*Main.dt*r0x);//puvodni radek
        pt2.vy = pt2.vy-a2*Main.dt*r0y;

    }

}